{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ede095b1",
   "metadata": {},
   "source": [
    "<p align=\"center\">\n",
    "    <img src=\"https://github.com/GeostatsGuy/GeostatsPy/blob/master/TCG_color_logo.png?raw=true\" width=\"220\" height=\"240\" />\n",
    "\n",
    "</p>\n",
    "\n",
    "## Interactive Model Fitting\n",
    "\n",
    "### Michael J. Pyrcz, Professor, The University of Texas at Austin \n",
    "\n",
    "*Novel Data Analytics, Geostatistics and Machine Learning Subsurface Solutions*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e15b023",
   "metadata": {},
   "source": [
    "#### Fitting a Model\n",
    "\n",
    "There are two common methods to fit a model, ordinary least squares and maximim likelihood estimation. Here I provide a short description and then demonstrate them together for fitting a parametric Gaussian distribution to a synthetic data set.\n",
    "\n",
    "First, let's define the model and data.\n",
    "\n",
    "* The model parameters, $\\beta$, are trained to the training data, $X_{\\alpha}, \\alpha = 1,\\ldots,n$.\n",
    "* In this example the model is a parametric Gaussian distribution; therefore the model parameters are the mean, $\\mu$, and standard deviation, $\\sigma$.\n",
    "* For this example, the synthetic data are a limited set of independent samples from an 'unknown' Gaussian distributions; therefore, we expect that our model selection should be reasonable, i.e., the data is somewhat Gaussian distributed.\n",
    "\n",
    "##### Ordinary Least Squares Fitting\n",
    "\n",
    "This is a very common method for fitting a model, let's minimize the error between the model predictions and the observations. \n",
    "\n",
    "* We calculated the model predictions, $\\hat{y}_{\\alpha}$, at training data locations, $\\alpha = 1,\\ldots,n$.  \n",
    "* Then we compare the model predictions to the true data observations as the squared error, $\\Delta y_{\\alpha}^2 = \\left(\\hat{y}_{\\alpha} - y_{\\alpha} \\right)^2$, where the model predictions, $\\hat{y}_{\\alpha} = \\hat{f}_{\\beta}(X_{\\alpha})$, are estimated with our estimated model parameters, $\\hat{f}_{\\beta}(X_{\\alpha})$.\n",
    "* We then sum the squared error over all data observations, the sum of squared error (SSE) is $\\sum_{\\alpha=1}^n \\left(\\hat{y}_{\\alpha} - y_{\\alpha} \\right)^2$\n",
    "\n",
    "Now we pose the model parameter estimation problem as an optimization problem to select the model parameters such that we minimize the SSE.\n",
    "\n",
    "\\begin{equation}\n",
    "\\hat{\\beta}^{OLS}= {\\text{arg min}}_{\\beta} \\rightarrow \\left(\\hat{f}_{\\beta}(X_{\\alpha}) - y_{\\alpha} \\right)^2\n",
    "\\end{equation}\n",
    "\n",
    "##### Maximum Likelihood Fitting\n",
    "\n",
    "This is a different way to approach fitting a model, find the model parameters, $\\beta$, that maximizes the probability of the sample data, $X$. \n",
    "\n",
    "For the Bayesian approach to machine learning, this is the **likelihood** that is applied to the **prior** to calculate the **posterior**. Under the assumption of data independence we apply the product sum to the probability of each of the data, $X_\\alpha = 1,\\ldots,n$, given the model:\n",
    "\n",
    "\\begin{equation}\n",
    "P(X | \\hat{f}_{\\beta}) = \\prod_{\\alpha = 1}^{n} P(X_{\\alpha}|\\hat{f}_{\\beta}(X)), \\alpha = 1,\\ldots,n\n",
    "\\end{equation}\n",
    "\n",
    "For our maximization it is sufficient to work with likelihoods, the density values directly from the PDF model, $\\hat{f}_{\\beta}(X_{\\alpha})$.\n",
    "\n",
    "\\begin{equation}\n",
    "P(X | \\hat{f}_{\\beta}) = \\prod_{\\alpha = 1}^{n} \\hat{f}_{\\beta}(X_{\\alpha}), \\alpha = 1,\\ldots,n\n",
    "\\end{equation}\n",
    "\n",
    "This solution can be very small given a large number of sample data, so we commonly apply the log transform to work with the sum of the log likelihoods and we calculate the negative sum of log likelihoods to convert this to a standard minimization problem.\n",
    "\n",
    "\\begin{equation}\n",
    "P(X | \\hat{f}_{\\beta}(X)) = -\\sum_{\\alpha = 1}^{n} log \\left(\\hat{f}_{\\beta}(X_{\\alpha})\\right), \\alpha = 1,\\ldots,n\n",
    "\\end{equation}\n",
    "\n",
    "Now we pose the model parameter estimation problem as an optimization problem to select the model parameters such that we minimize the negative log likelihood.\n",
    "\n",
    "\\begin{equation}\n",
    "\\hat{\\beta}^{OLS}= {\\text{arg min}}_{\\beta} \\rightarrow P(X | \\hat{f}_{\\beta}(X))\n",
    "\\end{equation}\n",
    "\n",
    "#### Comparing OLS and MLE Approaches\n",
    "\n",
    "We calculate the model parameters, such that we:\n",
    "\n",
    "**OLS**: - minimize the sum of the squared differences between the observed values and the values predicted by the model.\n",
    "\n",
    "**MLE**: - maximize the likelihood of the observed data given the model.\n",
    "\n",
    "Both methods assume sufficient sample data, sample data representativity, correct model specification, in adddition:\n",
    "\n",
    "**OLS**: - assumes that the errors have a mean of zero, constant variance and are independent of eachother (no correlation in error).\n",
    "\n",
    "Wit\n",
    "\n",
    "\n",
    "#### Load and Configure the Required Libraries\n",
    "\n",
    "The following code loads the required libraries and sets a plotting default."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "da837ef7",
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "seed=73073                                              \n",
    "supress_warnings = False\n",
    "import os                                               # to set current working directory \n",
    "import sys                                              # supress output to screen for interactive variogram modeling\n",
    "import numpy as np                                      # arrays and matrix math\n",
    "import pandas as pd                                     # DataFrames\n",
    "from scipy.optimize import curve_fit\n",
    "from scipy.optimize import minimize\n",
    "from scipy.stats import norm                            # Gaussian PDF\n",
    "import matplotlib.pyplot as plt                         # plotting\n",
    "import seaborn as sns                                   # plot PDF\n",
    "from sklearn.model_selection import train_test_split    # train and test split\n",
    "from sklearn import tree                                # tree program from scikit learn (package for machine learning)\n",
    "from sklearn import metrics                             # measures to check our models\n",
    "import scipy.stats as stats                             #search for neighbours\n",
    "from matplotlib.patches import Rectangle                # build a custom legend\n",
    "from matplotlib.ticker import (MultipleLocator, AutoMinorLocator) # control of axes ticks\n",
    "import math                                             # sqrt operator\n",
    "from ipywidgets import interactive                      # widgets and interactivity\n",
    "from ipywidgets import widgets                            \n",
    "from ipywidgets import Layout\n",
    "from ipywidgets import Label\n",
    "from ipywidgets import VBox, HBox\n",
    "cmap = plt.cm.inferno                                   # default color bar, no bias and friendly for color vision defeciency\n",
    "plt.rc('axes', axisbelow=True)                          # grid behind plotting elements\n",
    "if supress_warnings == True:\n",
    "    import warnings                                     # supress any warnings for this demonstration\n",
    "    warnings.filterwarnings('ignore')                  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b57659e",
   "metadata": {},
   "source": [
    "#### Declare Functions\n",
    "\n",
    "The following functions for clean code. \n",
    "\n",
    "* Just a improved grid for the plot.\n",
    "\n",
    "* Gaussian negative log likelihood function modified from [StackExchange](https://stats.stackexchange.com/questions/504004/how-do-we-code-a-maximum-likelihood-fitting-for-a-simple-gaussian-data) solution from jkpate."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a333fd85",
   "metadata": {},
   "outputs": [],
   "source": [
    "def add_grid():\n",
    "    plt.gca().grid(True, which='major',linewidth = 1.0); plt.gca().grid(True, which='minor',linewidth = 0.2) # add y grids\n",
    "    plt.gca().tick_params(which='major',length=7); plt.gca().tick_params(which='minor', length=4)\n",
    "    plt.gca().xaxis.set_minor_locator(AutoMinorLocator()); plt.gca().yaxis.set_minor_locator(AutoMinorLocator()) # turn on minor ticks\n",
    "    \n",
    "def gaussian_negloglike(params):    # Calculate sum negative log likelihood\n",
    "    mu = params[0]; sigma = params[1]\n",
    "    neg_log_likelihood = -1*np.sum(stats.norm.logpdf(X, loc=mu, scale=sigma)) \n",
    "    return neg_log_likelihood"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec5bb17b",
   "metadata": {},
   "source": [
    "#### Make and Display a Synthetic Dataset\n",
    "\n",
    "We draw random samples from a a parametric Gaussian distritubion and visualize the data-derived nonparametric and the Gaussian parametric CDF, fit with: \n",
    "\n",
    "* OLS - ordinary least squares\n",
    "\n",
    "* MLE - maximum likelihood estimation "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a59e3cb8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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qVOncvjwYWbNmuWy3VmzZlGvXj1mzJiRW2TfcMMNrFixgnbt2gHmJbrt27enbt26PPPMM9SoUYMvvviCYcOGceDAASZOnOiyzYceeoh27drxwgsvEBAQQLVq1c7qOIWHh3Pttdfy5ptvsmPHDs4777x81+vVqxdr165l2rRpREVFceTIEdauXcvBgwcB89LLAQMG8M8//xR4Sflzzz1HVFQUTz/9NOXKlaNx48aFZuvRowd33HEHgwYN4o8//mDChAn8+eefJCYmEhwcXOSvsWvXrjz++OM8/PDDJCQkcOmllwIF9/wahkH37t35+uuveeihh7jiiiv49ddfmThxIqtWrWLVqlUuf1BZv349o0ePZty4cVSvXp1XXnmF++67j0aNGnHllVfmu4/g4GDuvfdeXnjhBRISElwuD33jjTdIT0+nX79+BX5Nu3btonLlyjz55JNUrVqVQ4cO8dprr2G321m3bh1NmjQp8vHJkZmZyb///kvVqlUBs/ho0qQJd911F5UqVWL37t3MmTOHNm3a8Oeff7p8PwD079+frl27snDhQo4fP05wcLDbOR9++GE6derE/Pnz2bp1K2PGjKFnz54EBQXRsmVL3njjDdatW8fDDz9M2bJlee6553I/O3DgQObPn8+wYcOIi4vj0KFDTJkyhfbt27N+/XqqV69e6HmanZ3NLbfcwvfff09sbCzt27fn33//ZeLEiVx11VWsWbPGpYd37dq1bNiwgUceeYQGDRpQpkyZMx7jrKysPG0BAQEEBJj9EvHx8UyaNIlHHnmEK6+8kszMTP7666/cP7zcf//9HDp0iOeff57333+fmjVrAmfu+U1ISKBFixYkJCRw5MgRRo8eTbdu3bDb7QQHBzN37lz+/fdfxowZw/3338+SJUtyP7tx40ZuvPFGRowYQZkyZfjrr7+Ii4vj559/zr2ke8KECRw/fpx3332XVatW5X42J9/p9u/fT/v27Tlx4gSPPfYY9evX55NPPmHMmDH8888/eS7lTkhIoGnTprn3bk+YMIEbb7yRLVu2UL58+UK/dhGRXIaISAm2Z88eAzDuuuuuIq2/YcMGAzCGDBni0p6YmGgAxsMPP5zb1rFjRwMwPvroI5d1H3jgASMgIMD4999/DcMwjC1bthiAUatWLSMtLS13veTkZKNSpUrGtddem9vWpUsX47zzzjOOHj3qss2hQ4caYWFhxqFDhwzDMIzly5cbgHHllVcW6esyDMMAjJiYmALfdzgcBmAkJia65J43b17uOpGRkcaIESMK3U/Xrl2NevXq5WnP2V7Dhg2NEydO5PveqfuaOHGiARgjR450WXfx4sUGYCxatMjla5s4cWKefdarV8/o06dP7ut33nnHAIzly5fnWbdPnz4uuT///HMDMOLj413We+uttwzAeOmll1z2ExYWlvtvbhiGkZaWZlSqVMkYOHBgnn2d6tdff82zPcMwjMsuu8xo1apV7uv8jtHpsrKyjBMnThiNGzfOc9zyU69ePePGG280MjMzjczMTGPLli1Gnz59DMAYO3ZsgftISUkxypQpY8ycOTO3fd68eQZg9O7d+4z7LShnznndrVs3l/VHjBhhAMawYcNc2rt3725UqlQp9/WqVasMwHjmmWdc1tu+fbsRHh5uxMbG5rYVdJ6+8cYbBmC89957Lu2rV682AGP27Nm5bfXq1TMCAwONv//++4xfs2EYucc2v8c111yTu95NN91kXHzxxYVu66mnnjIAY8uWLXne69ixo9GxY8fc1znnTsuWLQ2n05nbPmPGDAMwbr75ZpfP5xzv038O5cjOzjYyMzONFStWGICxfv363PdiYmKMgv57efr347hx41x+5uQYPHiwYbPZco9rTv6LLrrIyMrKyl3v559/NgDjjTfeyHd/IiL50SXQIiKnWL58OUCey/Quu+wyLrjggjyXLJctW9bl8mmAu+++m+zsbL777juX9ujoaMLCwlw+261bN7777jucTifp6el8/fXX9OjRg4iICLKysnIfN954I+np6Xku97v11lvP9UvOZRjGGde57LLLmD9/PlOnTuWnn34iMzPT7f3cfPPNbvXc3nPPPS6v77jjDoKCgnL/rbwlp1fr9HPh9ttvp0yZMnnOhYsvvpi6devmvg4LCyMqKirPpcKnu+iii2jVqhXz5s3LbduwYQM///wz/fv3L/SzWVlZPP7441x44YWEhIQQFBRESEgIGzduZMOGDUX5Mlm6dCnBwcEEBwfToEED3n77bR588EGmTp0KQEpKCg6Hg0aNGhEUFERQUBCRkZEcP348333kd066m/Omm25yeX3BBRcAZi/+6e2HDh3KvQz6k08+wWazce+997p8/9SoUYOWLVvmXiJcmE8++YQKFSrQrVs3l21cfPHF1KhRI882WrRoQVRU1Bm3myM8PJzVq1fneZza23nZZZexfv16hgwZwhdffEFycnKRt1+YG2+8MbeXGQo/rmBenpxj8+bN3H333dSoUYPAwECCg4Pp2LEjQJHPtdN98803XHjhhVx22WUu7X379sUwjDyDhXXt2pXAwMDc1y1atAA44/eYiMipdAm0iJRoVapUISIigi1bthRp/ZxLefO7ZK9WrVp5/qNVvXr1POvVqFHDZVunt5/eduLECVJSUkhJSSErK4vnn3+e559/Pt98p08JVNClhWcj52urVatWgeu89dZbTJ06lVdeeYUJEyYQGRlJjx49iI+Pz/fry4+7mU/fblBQEJUrV85zfD3t4MGDBAUF5V4KnMNms1GjRo08+69cuXKebYSGhpKWlnbGffXv35+YmBj++usvmjZtyrx58wgNDaVnz56Ffm7UqFEkJCTgcDjo2LEjFStWJCAggPvvv79I+wW4/PLLefbZZ7HZbERERNCwYUNCQkJy37/77rv5+uuvmTBhAm3atKFcuXLYbDZuvPHGfPeR37+vuzkrVark8jonT0Ht6enpREZGsnfvXgzDyPf7EuD8888/w9GAvXv3cuTIEZdjcKpz/R4MCAigdevWha7z0EMPUaZMGRYtWsQLL7xAYGAgV155JXFxcWf8bGHO5riC+UeQK664grCwMKZOnUpUVBQRERG59+cX9Vw73cGDB/OdeiznZ9CZvsdybkE42/2LSOmkAlhESrTAwECuueYaPvvss0Lvbc2R8x+s3bt351l3165dee533Lt3b55t7Nmzx2Vbp7ef3hYSEkJkZCTBwcEEBgbSq1cvYmJi8s3XoEEDl9eeGl03LS2Nr776ioYNGxZ6jKpUqcKMGTOYMWMG27ZtY8mSJYwbN459+/YVeSRtdzPv2bOH2rVr577Oysri4MGDLsc3NDSUjIyMPJ89lyK5cuXKZGVlsX//fpci2DAM9uzZQ5s2bc5626fr2bMno0aNYv78+UybNo2FCxfSvXt3KlasWOjnFi1aRO/evXn88cdd2g8cOJBnapyClC9fvsCi6ujRo3zyySdMnDiRcePG5bZnZGQUOHd2fv++nshZFFWqVMFms/H999/nO+Bdfm35baNy5coFns9ly5Z1ee2NEa6DgoIYNWoUo0aN4siRI3z11Vc8/PDDdOnShe3btxMREeHxfRbmm2++YdeuXXz77be5vb5AvnMQu6Ny5crs3r07T/uuXbsA8vy8FRHxBF0CLSIl3kMPPYRhGDzwwAOcOHEiz/uZmZl8/PHHAFx99dWA+R/2U61evZoNGzZwzTXXuLQfO3bMZaAYMOcXDQgIyDPw0fvvv5/bo5Lz2Y8//pgrrriCwMBAIiIi6NSpE+vWraNFixa0bt06zyO/XsZz5XQ6GTp0KAcPHsThcBT5c3Xr1mXo0KF07tyZtWvX5rYXtdezqBYvXuzy+u233yYrK8tllNv69evz66+/uqz3zTff5Bkh2J0eo5x/69PPhffee4/jx4/nORfORcWKFenevTsLFizgk08+Yc+ePWe8/BnM4uv0ou7TTz9l586dHslls9kwDCPPPl555RWXkc59nTPHTTfdhGEY7Ny5M9/vn4suuih33YLO05tuuomDBw/idDrz3cbZDCx2LipUqMBtt91GTEwMhw4dyh1RuTh7P3OK/NP/DV988cU867r7Pfbnn3+6/PwAWLBgATabjU6dOp1tZBGRAqkHWERKvHbt2jFnzhyGDBlCq1atGDx4MM2aNSMzM5N169bx0ksv0bx5c7p160aTJk0YMGAAzz//PAEBAdxwww25o0DXqVOHkSNHumy7cuXKDB48mG3bthEVFcXSpUt5+eWXGTx4sMv9oGD2Rnfu3JlRo0aRnZ1NXFwcycnJLtOmzJw5k8svv5wrrriCwYMHU79+fY4dO8amTZv4+OOP89wT5669e/fy008/YRgGx44d4/fff2fBggWsX7+ekSNH8sADDxT42aNHj9KpUyfuvvtumjZtStmyZVm9ejWff/450dHRuetddNFFvP/++8yZM4dWrVoV6ZLPwrz//vsEBQXRuXPn3FGgW7ZsyR133JG7Tq9evZgwYQKPPvooHTt25M8//2TWrFl5RoZt3rw5AC+99BJly5YlLCyMBg0a5PuHhc6dO9OlSxccDgfJycl06NAhdxToSy65JN+pi85F//79eeuttxg6dCjnnXce11577Rk/c9NNNzF//nyaNm1KixYt+N///sdTTz11xisdiqpcuXJceeWVPPXUU1SpUoX69euzYsUKXn31Vbd6br2dM0eHDh0YMGAA/fr1Y82aNVx55ZWUKVOG3bt388MPP3DRRRflzm1c0Hl61113sXjxYm688UaGDx/OZZddRnBwMDt27GD58uXccsst9OjR46wzZmdnFzh1zyWXXEJoaCjdunWjefPmtG7dmqpVq/Lvv/8yY8YM6tWrlztqek4xP3PmTPr06UNwcDBNmjTJ00PtCe3bt6dixYoMGjSIiRMnEhwczOLFi1m/fn2edXNyxcXFccMNNxAYGEiLFi3yvaR85MiRLFiwgK5duzJlyhTq1avHp59+yuzZsxk8eLBb91aLiBSZ78bfEhEpXr/88ovRp08fo27dukZISIhRpkwZ45JLLjEeffRRY9++fbnrOZ1OIy4uzoiKijKCg4ONKlWqGPfee6+xfft2l+117NjRaNasmfHtt98arVu3NkJDQ42aNWsaDz/8sJGZmZm7Xs4IpnFxccbkyZON8847zwgJCTEuueQS44svvsiTc8uWLUb//v2N2rVrG8HBwUbVqlWN9u3bG1OnTs1dJ2e03HfeeafIXz+njDgbEBBglCtXzrjooouMAQMGGKtWrco3B6eMOpyenm4MGjTIaNGihVGuXDkjPDzcaNKkiTFx4kTj+PHjuZ87dOiQcdtttxkVKlQwbDZb7oiwOdt76qmnzrgvwzg5CvT//vc/o1u3bkZkZKRRtmxZo2fPnsbevXtdPp+RkWHExsYaderUMcLDw42OHTsav/zyS55RZw3DHPm2QYMGRmBgoMs+Tx8F2jDMkZwdDodRr149Izg42KhZs6YxePBg4/Dhwy7r1atXz+jatWuer+v00XgL43Q6jTp16hiAMX78+CIdo8OHDxv33XefUa1aNSMiIsK4/PLLje+//77I+y0o96l27Nhh3HrrrUbFihWNsmXLGtdff73x+++/5zm2OaNAr169Os82ipqzoPO6oG3nnCP79+93aZ87d65ht9uNMmXKGOHh4UbDhg2N3r17G2vWrMldp6Dz1DAMIzMz03j66aeNli1bGmFhYUZkZKTRtGlTY+DAgcbGjRvdOn6nKmwUaCB3288884zRvn17o0qVKkZISIhRt25d47777jO2bt3qsr2HHnrIqFWrlhEQEOAyunlBo0Cf/r3nzvFeuXKl0a5dOyMiIsKoWrWqcf/99xtr167Nc05mZGQY999/v1G1atXc45ozUnV+34///vuvcffddxuVK1c2goODjSZNmhhPPfWUy2jVhf3soIAR4EVECmIzjCIM+ykiInlcddVVHDhwgN9//73Q9bZu3UqDBg146qmnGDNmTDGlExEREZHT6R5gERERERERKRVUAIuIiIiIiEipoEugRUREREREpFTwaQ/wd999R7du3ahVqxY2m40PP/zwjJ9ZsWIFrVq1IiwsjPPPP58XXnjB+0FFRERERETE8nxaAB8/fpyWLVsya9asIq2/ZcsWbrzxRq644grWrVvHww8/zLBhw3jvvfe8nFRERERERESszm8ugbbZbHzwwQd07969wHUcDgdLlixhw4YNuW2DBg1i/fr1rFq1qhhSioiIiIiIiFUF+TqAO1atWsV1113n0talSxdeffVVMjMzCQ4OzvOZjIwMMjIyCt1udnY2hw4donLlythsNo9mFhEREREREfcYhsGxY8eoVasWAQGeu3DZUgXwnj17qF69uktb9erVycrK4sCBA9SsWTPPZ5544gkmT55cXBFFRERERETEQ7Zv3855553nse1ZqgAG8vTQ5lzBXVDP7UMPPcSoUaMK3ebRo0epW7cuiYmJ1KhRwzNBvSgtLQ2A8PBwHycpGivltVJWgJSUFNavX0/Lli2JjIz0dZxCWe3YKq/3WOm8BWsdW7BWXitlBZ273mSlrHAWeVNSCNizh4DduwnYvRvbvn0EHDyI7eBBbIcOYTt4kID/nm2ZmR7LaUREkB0aSkZAAMFlyxIQHo4RHo4RGgqhoRhhYeZzaCgEB0NICEZICAQHm885y0FB5nJgoLkcFGSuHxhIdmAQxzLDOHA8gkNp4RxKCeFwShiHUkI5fDyEg8nBHD4WwuFjQRw5Fsyx44EkpwRyPC3QY1/n6Ww2A/NLMwgNhZAQ8/nU1ye/PCPnSyc42MD8Uo3cLzE42CAw0PySzTYjdzkwEJzODIKCDMLDQwkKMveds35goPkICDAICDj1tWt7fg+bzTjt9cnHydfGaa/zrpvzAEhPT8Nms8732Z49e7Db7ZQtW9aj27VUAVyjRg327Nnj0rZv3z6CgoKoXLlyvp8JDQ0lNDS0yNuvW7fuOef0tpSUFABL/PIFa+W1UlaAI0eOsHHjRmrVqkWFChV8HadQVju2yus9VjpvwVrHFqyV10pZQeeuN1kpK5yW1zBg/37YuBE2bYLNm2HHDtdHcrJ7OyhTBipVgooVzUeFCnkf5ctDuXIQGZn/IzwcAgI4cuQIiStW0LFjR7fOW8OAo0dh2zbYvh327IHdu2HPv/897zn5/N/fA85KRITrl1SmTBZlykDFikG5X0rZsq5fWpky5udOf4SHm8/BwSeLPm+z0rlrpayn8vQtqpYqgNu1a8fHH3/s0vbll1/SunXrfO//FRERERHxiCNH4PffYeNGQv78E9s//8DWrWbRe+zYmT9fvjycd575qFULqlWDqlXzf0REePurwTBg714z/rZt5uPff12Xi/Jl5YiMNKNXrgxVqpiP05dz6vny5U8WvKf/Fz4lJf2/7VmrSBPr8GkBnJKSwqZNm3Jfb9myhV9++YVKlSpRt25dHnroIXbu3MmCBQsAc8TnWbNmMWrUKB544AFWrVrFq6++yhtvvOGrL0FEREREShKn06wKf/0V1q8/+bxtW+4qIad/xmaDunWhUSNo2NBczil2zzsPatc2K8RiZhhw4ICNv/6qyK5dwezcaXZU53RWF6XArVwZ6tQxa/YaNaBmzfyfi6FmF/EInxbAa9asoVOnTrmvc+7V7dOnD/Pnz2f37t1sO+WHTYMGDVi6dCkjR44kISGBWrVq8dxzz3HrrbcWe3YRERERsTjDgH/+gR9/hJUrYd06s5e3oGt669aFpk05Ua8exvnnE9qsGTRuDA0aQBFvufOWo0fN6L/9dvLx++9w+HB54Mp8P5NTtzdoYD7nPOrVM5/r1DEvNxYpSXxaAF911VUUNg3x/Pnz87R17NiRtWvXejFVwZxOJ5keHJjgbOVM6xQU5L9XsAcHBxMY6L3BDURERETcduKEWeT++CP88INZ9O7dm3e98HBo3hxatjQfLVqYj//uoT3x372UoT7q1d26FX7++WQH9W+/uXRQ51G5chrNmgVxwQXBNG5M7uP8831et4sUO/+toPyIYRjs2bOHI0eO+DoKYM5bDHh0PixvqFChgiVG1RYREZESyumE1ath6VJYscKsGtPTXdcJCYFWraBDB2jTxix4GzUyh+n1A4cPm19CYqL5+Plnc8yt/NSuDRdd5PqoVu0Iq1e7PwiWSEmlArgIcorfatWqERER4fGRyNzldDoB/LaH1TAMUlNT2bdvH4DHhy4XERERKdChQ/DFF2bR+/nncOCA6/uVK0P79mbB26EDtG4NYWG+yXoaw4CkJFi+3OycTkw0X58uONis0y+91OyYvugis8O6UqW86/pJ/42I31ABfAZOpzO3+C1oqqXi5u8FMJycX2zfvn2UKVPG73urRURExKIMw7wO+NNPzaJ31Sr472o5wBxquEsX6NwZLr8cmjQpvjlyimDLFvjmG7Po/eYbc2qh0zVsCHa7+bjsMrj4Yr+p2UUsRwXwGeTc8xuhoe3clnPMsrKyCAnJM16iiIiIyNlLSoJFi8zHli2u7zVvDl27wo03Qrt2eefa8aE9e2DZspNF77//ur4fGmp2UF955cmC10/6YERKBBXAReTry56tKOeYFTbQmYiIiEiR7dsHb71lFr0//3yyPSICrrnGLHpvuMEcwthPGAb88QcsWWI+EhNd3w8KMgvdTp3g6qvNel29uyLeowJYRERERPxXaqpZOS5aZN7T+9+tYAQGmpc29+oFN9/sVxPRZmbC99+fLHpP76Bu1QquvdYsejt08MkUwSKllgpgEREREfE/SUkwcyYsXAjHjp1sb9MG7r0X7roLqlXzXb7TZGTAZ5/B22+btyIfPXryvbAws+Dt1g1uuglq1fJdTvGs1atXs2nTJlq0aIHdbvd1HCkCjUxUwm3fvp377ruPWrVqERISQr169Rg+fDgHDx7MXeeqq65ixIgRBW5j+fLldOrUiUqVKhEREUHjxo3p06cPWVlZxfAViIiISKlhGPDtt2aPbtOmMHu2WfzWrw+PPAIbNpiXPg8b5hfFr2GY0wkPGgQ1a0KPHvDGG2bxW7Uq9O8PH35oDkT98ccwYICK35LE4XBw9dVXM2DAANq2bYvD4fB1JCkC9QCXYJs3b6Zdu3ZERUXxxhtv0KBBA/744w/Gjh3LZ599xk8//USl/MbLP8Uff/zBDTfcwLBhw3j++ecJDw9n48aNvPvuu7nzEYuIiIickxMnCHrvPbPg/eWXk+033QQjRpjXCvvRjBJ//23j7beDeftt2Lr1ZHutWtCzJ9x6qzl4lR9P2CHnKDExkfj4eJe2+Ph4oqOj1RPs51QAnw3DMO9H8QU37m+JiYkhJCSEL7/8Mndaorp163LJJZfQsGFDxo8fz5w5cwrdxrJly6hZs6bLN3jDhg25/vrrzy6/iIiISI5Dh+DFF4l47jkC9uwx28LDoW9fGD7cnLLITxw6ZF6NvWgRrFlTJrc9MhJuu828Kvuqq1T0lhZJ+U3Q/F+7CmD/pgL4bKSm+m60gpSUIg0NeOjQIb744gumTZuWW/zmqFGjBvfccw9vvfUWs2fPLnQ7NWrUYPfu3Xz33XdceeWV5xRdREREBIDDhyEuDp57DtLSCACya9QgYNgw8zphP5r3Z/16mDULFi+GtDSzLTDQ4NprnfTrF0S3bn41/pYUk6ioKLfaxX+oAC6hNm7ciGEYXHDBBfm+f8EFF3D48GH2799f6HZuv/12vvjiCzp27EiNGjVo27Yt11xzDb1796ZcuXLeiC4iIiIlVXq6WU0+/rhZBANcfDHpQ4aQdeutRJ7h1qzikpkJ779vRv3hh5PtLVrAAw9A167HqVoVIjV8c6llt9uJjY11uUrS4XCo99cCVACfjYgIsyfWV/v2wL23OXPznml+48DAQObNm8fUqVP55ptv+Omnn5g2bRpxcXH8/PPP1KxZ85yziIiISAnndJrXDz/6KGzfbrY1awZPPAE33UTW8eO+zfefPXvgpZfghRdg926zLSjIvKd36FBzyiKbzXf/DRT/EhcXx/XXX69RoC1GBfDZsNmgTJkzr+dDjRo1wmaz8eeff9K9e/c87//1119UrFiRKlWqFGl7tWvXplevXvTq1YupU6cSFRXFCy+8wOTJkz2cXEREREoMwzDnBBo3Dn7/3Ww77zx47DFz/l4/uWH2t9/gySfhnXfM3l+AGjVg4ECN3CyFa9OmDW3atNHVABbiP8PpiUdVrlyZzp07M3v2bNJyblj5z549e1i8eDF33nnnGXuA81OxYkVq1qzJcT/5a62IiIj4oZ9+MkeFuukms/itWBGeesqc37dvX78ofn/5xezdbdECXn/dLH47dDCnMvr3X5g0ScWvSEmjHuASbNasWbRv354uXbowdepUl2mQateuzbRp03LX3b9/P7+cOu0A5gBYH330Eb/88gs9evSgYcOGpKens2DBAv744w+ef/75Yv6KRERExO8dPQpjx8LLL5uvQ0PNEZ3HjTOLYD+wZo3ZCb1kifnaZjNHch43Di691LfZRMS7VACXYI0bN2bNmjVMmjSJO++8k4MHD1KjRg26d+/OxIkTXeYAfv3113n99dddPj9x4kRuueUWfvjhBwYNGsSuXbuIjIykWbNmfPjhh3Ts2LG4vyQRERHxZ0uWwODBsGuX+bpvX5gyBerU8WmsHD/9ZBa+S5earwMC4K67YPx4uPBC32YTkeKhAriEq1evHvPmzSt0nW+//bbQ9xcuXOjBRCIiIlLi7NsHw4bBW2+Zrxs3hldeAT+ZQnHlSpg8Gb780nwdGAj33AMPP+xXUw2LSDFQASwiIiIiZ8cwzAlyhw+HQ4fMynLMGJg4EcLDfZ2OLVvA4TAHtwJzROfeveGhh6BRI99mExHfUAEsIiIiIu7bvh0GDTp5PXHLlvDqq9CqlW9zAcnJ5gxLzz4LGRnmpc79+5s9vg0a+DqdiPiSCmARERERKTrDgBdfNAe6SkmBkBCzx3fsWAgO9mk0pxPmzYNHHoG9e822a64xC+GLLvJpNBHxEyqAT5Genk7KaTObZ2RkkJ2djdPpxOl0+iiZq+zsbF9HKBKn00l2djbp6el+c+zOJDU11dcR3JIzxVVaWhpBQf797Wy1Y6u83mOl8xasdWzBWnmtlBV07gJw7BihMTEEf/ABAE67nfSEBIwmTcyu1oyMs9qsJ7J+910g48aF8Ntv5vRKDRtm8/jjGdxwgxObzazVPcVK567OW++yUl4rZQWzNvMG//8u8LCEhAQSEhJc2qxSnImIiIj4SsCGDYTdcw8BGzdiBAdzYsoUMocMMa8v9qHNm2088kgoH39s/re2QgWDceNO8MADmYSE+DSaX1i7di3Lly8nKChIM3iIUAoL4JiYGGJiYlzakpOTKV++PGFhYURGRrq8FxQUREBAAIGBgQT6wYTtp/K3PKcLDAwkICCAsLAwQkND8xxbf2aVrFlZWQCEh4dbJrNVcuZQXs+z4nkL1ji2p7JSXqtkLdXn7uuvwwMPQGoqnHcetnfeIbRtW0LPfcsu3MnqdJqXNk+YAOnp5vhbgwbBpEk2qlQJBY+ny8vfzwOHw0F8fDwAM2fOJDY2lri4OB+nKhp/P7ans1Jeq2QNCwvzynZ9+yc7EREREfFfGRkwdKg5Z1BqKlx7LaxdC23b+jTW779Du3bmbcfp6eZ9vr/+CrNmQZUqPo3mNxITE3OL3xzx8fEkJib6KJGIf1ABLCIiIiJ5bdtmzuObc+vYI4/A559D1ao+i3TiBEyZApdeCqtXQ/ny5nTDy5bBhRf6LJZfSkpKcqtdpLQodZdAi4iIiMgZfPkl3H03HDwIFSvCwoXQtatPI61ZY05l9Ntv5uubb4Y5c6BWLZ/G8ltRUVFutYuUFuoBFhERERGTYcC0aXD99Wbx26qVecmzD4vftDRwOMBuN4vfKlXgjTfgww9V/BbGbrcTGxvr0uZwOLDb7T5KJOIfVACXYH379sVmszFo0KA87w0ZMgSbzUbfvn1z1+3evXuB26pfvz42my3P48knn/RSehERESlWTqc5itQjj5iF8IAB8MMPUL++zyKtWgUtW0J8PGRnw113wZ9/ms82m89iWUZcXBzLli1j+PDhLFu2TP9vE0GXQJd4derU4c033+TZZ58lPDwcMOfUeuONN6hbt65b25oyZQoPPPCAS1vZsmU9llVERER8JD3dvOT5gw/MyjIhAQYP9lmc7Gx4+ml4+GGzLq9ZE154wbzsWdzTunVrjh8/TuvWrX0dRcQvqAA+C4ZhDoToCxER7q1/6aWXsnnzZt5//33uueceAN5//33q1KnD+eef79a2ypYtS40aNdwLICIiIv7tyBG45Rb47jsICTGnPLr1Vp/F2b8f+vSBzz4zX991l3mvb4UKPoskIiWICuCzkJoKvpo+KyUF3J0Sq1+/fsybNy+3AJ47dy79+/fn22+/9XxAERERsY7du837fX/9FcqVg48+gquu8lmc776Dnj1h1y7z/zvPPQf336/LnUXEc3QPcCnQq1cvfvjhB7Zu3cq///7Ljz/+yL333uv2dhwOB5GRkS4PFdEiIiIWtXEjtG9vFr/Vq8OKFT4rfp1OiI8PplMns/ht2hR+/hkeeEDFr4h4lnqAz0JEhNkT66t9Z2e795kqVarQtWtXXnvtNQzDoGvXrlQ5i1nix44dmztoVo7atWu7vR0RERHxsTVr4MYbzeuNGzY0pz1y89YoT9mzB3r2DOPbb83/lvbpA7Nm+e5qOxEp2VQAnwWbDcqU8XUK9/Tv35+hQ4cCkJAzob2bqlSpQqNGjTwZS0RERIrbsmUQHW3+Nf/SS2HpUrMH2Ae+/hruuQf27g0iIsJg9mwbffr4JIqIlBK6BLqUuP766zlx4gQnTpygS5cuvo4jIiIivvDOO+acvikpcM01sHy5T4pfw4Ann4TOnWHvXrjwQicrVqSq+BURr1MPcCkRGBjIhg0bcpfzc/ToUX755ReXtkqVKuVOl3Ts2DH27Nnj8n5ERATlypXzfGARERHxrI8+MkeYcjrhjjtgwQIIDS32GBkZ5hTDCxaYr++/Hx5/PI3/ZmsUEfEq9QCXIuXKlSu0WP3222+55JJLXB6PPvpo7vuPPvooNWvWdHnExsYWR3QRERE5F199ZRa9Tif06mVOdeSD4nf/frj2WrP4DQw0pxt++WVU/IpIsVEPcAk2f/78Qt//8MMPXdYtbP2tW7d6JJOIiIgUs5UrzXl+T5ww7/2dO9esPotJYmIiSUlJBAdH8fDDdrZsgfLlzauxO3cuthgiIoAKYBEREZESK+CXX+CmmyA1Fbp0MXt+g4rvv38Oh4P4+PhTWmI5//w4PvkELrig2GKIiOTSJdAiIiIiJZDtr78I794djh6FK66A998v1sueExMTTyt+AeKZPTtRxa+I+IwKYBEREZGSZvNmwm++GdvBg9C6NXzyCUREFGuEDRuS8m3fty//dhGR4qACWERERKQk2bkTrr2WgN27cV5wAXz+ORTzjA3JyTBnTlS+70VF5d8uIlIcVAAXkWEYvo5gOTnHzGaz+TiJiIhIKZEzzPKWLWQ3bEj6kiVQuXKxRjh40Jxi+Oef7QQFuc4W4XA4sNvtxZpHRORUGgTrDIKDgwFITU0lXGP0uyU1NRWAoGIcbENERKTUOnLEHOjqr7+gTh3SlizBqFGjWCPs3m2O7PzHH2bd/fnncTid0SQlJREVFaXiV0R8TpXJGQQGBlKhQgX27dsHQEREhM97NJ1OJ2Bm80eGYZCamsq+ffuoUKECAQG60EBERMSrMjPhtttg3TqoVg2++gqjVq1ijbB1q9n5/M8/UKsWLFsGF14IYFfhKyJ+QwVwEdT476+nOUWwr2VnZwP4fWFZoUIFatSowfHjx30dRUREpGQbNQq+/hoiI+HLLyEqClJSim33f/9tFr87dkCDBvDVV3D++cW2exGRIlMBXAQ2m42aNWtSrVo1MjMzfR0nt6AsU6aMj5MULDg42G97qEVEREqUl16CWbPAZoNFi6Bly2Ld/fr15mXP+/ebc/suWwa1axdrBBGRIlMB7IbAwEC/KOqysrIACAsL83ESERER8akVKyAmxlyeOhVuuaVYd79qFdx4o3n78SWXwBdfQNWqxRpBRMQtKoBPkZ6eTkoxXi50tnIGl7IKK+W1UlaAtLS03Gd/H2zMasdWeb3HSuctWOvYgrXyWikr+N+5a9u6lYjoaGxZWWTedhsZDz7octmzt4/vt98GctddYRw/bqNtWyfvvptGePjZXXlttXPBSnn97bw9EysdW7BWXitlBbM28wb//y7wsISEBBISElzacgaVEhEREbGEY8cIu/NObIcO4bzkEjISEsxLoIvJ0qWB9O4dRkaGjWuuyWLx4nT8+M4sEZFcpa4AjomJISbnUqH/JCcnU758ecLCwoiMjPRRMvdZKStYK69VsuZcDh8eHm6ZzFbJmUN5Pc+K5y1Y49ieykp5rZLVb87d7Gy4917480+oUYPAjz8mslq1Alf3dNZPPoF77oGsLOjRA954I4jQUM/swyrnQg4r5PWb89ZNVsoK1sprlazeut3Tv4cRFhERERFXjz4KH30EoaHw4YfFOuLU11+bsy1lZUHPnvD222YMERGrUAEsIiIiYhVvvgnTppnLL78MxTi/7qpV5hhbGRnQvTssWAAWuKVURMSFCmARERERK1izBvr1AyDxnntYCCQmJhbLrtetgxtugOPH4brrzDpcxa+IWJEKYBERERF/t2eP2e2ano7j/PNpu3gxvXv3pm3btjgcDq/uesMGs+g9ehQuvxw++ECXPYuIdakAFhEREfFn2dnQqxfs3Eli/frEb97s8nZ8fLzXeoI3b4Zrr4UDB6BVK3MArIgIr+xKRKRYqAAWERER8WdPPw1ffQURESQNGpTvKklJSR7f7c6dZvG7axc0awZffAHly3t8NyIixUp3b4iIiIj4q9WrYfx4c3nmTKIuuijf1aKiojy62337zOJ3yxZo1AiWLYPKlT26CxERn1APsIiIiIg/OnbMnGsoKwtuvx3uuw+73U5sbKzLag6HA7sHR4M+cgS6dIG//oI6dczO55o1PbZ5ERGfUg+wiIiIiD+KiYF//oG6deGll8BmAyAuLo7o6GiSkpKIioryaPGblgZdu8Ivv0D16mbxW6+exzYvIuJzKoBFRERE/M2iRbBwIQQEwOuvQ4UKLm/b7XaPFr5gjrXVty+sXGnu7ssvwcNXVouI+JwugRYRERHxJ//8A4MHm8sTJ0KHDsWy20cegbffhuBgc6qjFi2KZbciIsVKBbCIiIiIvzhxwrzvNyUFrrji5ABYXjZ3LjzxhLn8yitw1VXFslsRkWKnAlhERETEXzz6qDnyc8WK5mXQgYFe3+XXX8PAgebyhAnQu7fXdyki4jMqgEVERET8wVdfQXy8ufzKK+bgV172559w663mQNM9e8LkyV7fpYiIT6kAFhEREfG1/fuhVy8wDLM7Njra67vcu9cc8fnoUfM247lzcweaFhEpsVQAi4iIiPiSYUD//rBnD1x4IUyf7vVdpqXBLbfA1q3QsCF8+CGEhXl9tyIiPqcCWERERMSX5s2DTz6B0FB44w2IiPDq7rKzoU8fSEw0bzX+9FOoUsWruxQR8RsqgEVERER8ZfduGD3aXJ46tVjmHho/Ht555+R0R02aeH2XIiJ+I8jXAURERERKrQcfhCNHoFUrGDGCxMREkpKSiIqKwm63e3x3c+fCk0+ay6+8Ah07enwXIiJ+TT3AIiIiIr7wwQfw3nsQFASvvopj/Hjatm1L7969adu2LQ6Hw6O7+/lnGDzYXH70UU13JCKlkwpgERERkeJ25AjExJjLsbEkpqcTnzMF0n/i4+NJTEz0yO4OHIDbboMTJ6B7d5g0ySObFRGxHBXAIiIiIsUtNta8/zcqCiZMICkpKd/VCmp3h9NpzvG7fbu5u/nzNd2RiJReKoBFREREitO338LLL5vLL78MYWFERUXlu2pB7e549FH46itzcOn334fy5c95kyIilqUCWERERKS4pKXBAw+Yy4MGwZVXAmC324mNjXVZ1eFwnPNAWJ98Esjjj5vLr74KzZqd0+ZERCxPo0CLiIiIFJfJk2HTJqhdG+LiXN6Ki4sjOjraY6NAb9pkY+DAMACGD4e77jqnzYmIlAgqgEVERESKw9q18PTT5vLs2VCuXJ5V7Ha7R6Y/On4c7rknjORkGx06wFNPnfMmRURKBBXAp0hPTyclJcXXMc4oNTXV1xHcYqW8VsoKkJaWlvscFOTf385WO7bK6z1WOm/BWscWrJXXSlnhHM/drCzC+/cn0OkkMzqajKuvBi/9n8Mw4P77Q/nzz2CqVXMyf346GRkGGRle2Z1HWO1csFJe/cz1LivltVJWMGszb/D/7wIPS0hIICEhwaXN6XT6KI2IiIiUBsHPPUfg+vUYFStywsvdsS++GMzbbwcTGGjw8svJ1KgR7NX9iYhYSakrgGNiYojJmXfvP8nJyZQvX56wsDAiIyN9lMx9VsoK1sprlaxZWVkAhIeHWyazVXLmUF7Ps+J5C9Y4tqeyUl6rZD3rc3fjRnjiCQBszz5LmfPP90Y8AFauhIceMpenTTvB1VcHW+b4gnXOhRxWyKufucXDSnmtkjUsLMwr29Uo0CIiIiLeYhgwYACkp0PnztC7t9d2tWcP3H47ZGXBnXfCkCGZXtuXiIhVlboeYBEREZFi8/bb5ry/4eHw4otgs3llN9nZ0KsX7NoFF14Ir7zild2IiFieeoBFREREvCE1FcaONZcffhgaNPDarqZPh6++gogIeO89sMgVjiIixU4FsIiIiIg3xMfD9u1Qrx6MHu213axda9bXADNmQNOmXtuViIjlqQAWERER8bRt2yAuzlx++mnzEmgvOH4c7r4bMjOhRw+4/36v7EZEpMTQPcAiIiIi5ygxMZGkpCSioqKw2+0QG2sOfNWxI9x6q9f2O3Ik/P031K4NL7/stVuMRURKDBXAIiIiIufA4XAQHx+f+zr27ruJe+stCAgwr0n2UlX6wQcni96FC6FyZa/sRkSkRNEl0CIiIiJnKTEx0aX4BYh//XUSAR54AC6+2Cv73bHj5OXOsbHQqZNXdiMiUuKoABYRERE5S0lJSfm3h4fDY495ZZ9Opzmd8KFD0Lo1TJnild2IiJRIKoBFREREzlJUVFT+7QMHQtWqXtnn00/D8uVQpgy8/jqEhHhlNyIiJZIKYBEREZGzZLfbiY2NdWlzVKqE/bTLoj1lzRp45BFz+bnnoHFjr+xGRKTE0iBYIiIiIucgLi6O6FatSOrZk6jsbOyLF0NwsMf3k5JiTnmUlQW33w79+nl8FyIiJZ4KYBEREZFzZH/tNezZ2XDTTXD99V7Zx/DhsHEj1KkDL76oKY9ERM6GLoEWERERORdLl5qP4GB45hmv7OL992Hu3JNTHlWs6JXdiIiUeCqARURERM7WiRMwapS5PHw4FDAo1rk4cAAGDzaXx42Djh09vgsRkVJDBbCIiIjI2UpIgL//hmrVTo5O5WHDh8O+fdCsGUyc6JVdiIiUGiqARURERM7G4cMnJ+GdNg3Kl/f4Lj76yJzqKCAA5s2D0FCP70JEpFRRASwiIiJyNp5+Go4cMbtmvTAk86FDMGiQuTx2LLRp4/FdiIiUOiqARURERNy1Zw/MmGEuT5sGgYEe38XIkeZumjaFSZM8vnkRkVJJBbCIiIiIux5/HFJTwW6Hm2/2+OY//RQWLDh56XNYmMd3ISJSKqkAFhEREXFDwLZt8MIL5ovHH/f4hLxHjsCAAebyyJHQtq1HNy8iUqoF+TqAiIiIiL9KTEwkKSmJqKgomjRpAkBoXBxkZsI118DVV3t8n6NHw65d0LgxPPaYxzcvIlKqqQAWERERyYfD4SA+Pj739fDhw7m5USNC3nzTbHj8cY/v8/PPYe5cs1N57lwID/f4LkRESjWfXwI9e/ZsGjRoQFhYGK1ateL7778vdP3FixfTsmVLIiIiqFmzJv369ePgwYPFlFZERERKg8TERJfiF2DmzJmkvvgituxs6N4dLrvMo/tMToYHHjCXhw2Dyy/36OZFRAQfF8BvvfUWI0aMYPz48axbt44rrriCG264gW3btuW7/g8//EDv3r257777+OOPP3jnnXdYvXo1999/fzEnFxERkZIsKSkp3/bDv/+OYbPB1Kke3+fYsbBjB5x/vjmwtIiIeJ5PC+Dp06dz3333cf/993PBBRcwY8YM6tSpw5w5c/Jd/6effqJ+/foMGzaMBg0acPnllzNw4EDWrFlTzMlFRESkJIuKisq/Hci8805z7l8P+uoreOklc/nVV6FMGY9uXkRE/uOze4BPnDjB//73P8aNG+fSft1117Fy5cp8P9O+fXvGjx/P0qVLueGGG9i3bx/vvvsuXbt2LXA/GRkZZGRkFJolOTkZgJSUFI4cOeLeF+IDqampAGRlZfk4SdFYKa+VsgIcO3bM5dmfWe3YKq/3WOm8BWsdW7BWXn/O2qRJE4YPH87MmTNz2xxAm6Ag9gwdSoQH/7+QkgL9+5cDArj//gwuvjgNT2zen4/v6ayUFayVVz9zvctKea2UFczazBt8VgAfOHAAp9NJ9erVXdqrV6/Onj178v1M+/btWbx4MXfeeSfp6elkZWVx88038/zzzxe4nyeeeILJkycXKdP69evZuHFj0b8IET+xdu1aX0cQcZvOW/F3nTp1onbt2uzcuZMbP/iA67ZtY/N11/HbgQOwYoXH9jNvXjO2b69A1aqpXHPNN6xY4fTYtkVy6GeuWE1Owe5pPh8F2nba3HmGYeRpy/Hnn38ybNgwHn30Ubp06cLu3bsZO3YsgwYN4tVXX833Mw899BCjRo0qNENycjJ16tShZcuW1KpV6+y+kGKUczJERET4OEnRWCmvlbKC+dfctWvXcumll1K2bFlfxymU1Y6t8nqPlc5bsNaxBWvltULWjh07EvTZZ0TOnEl2WBhJt93m0XP3998D+OQTc1uzZmVz3XWeG/nKCsc3h5WygrXy6meud1kpr5WyAuzatcsr2/VZAVylShUCAwPz9Pbu27cvT69wjieeeIIOHTowduxYAFq0aEGZMmW44oormDp1KjVr1szzmdDQUEJDQ4uUKTIykgoVKrj3hfhAUJD5zxYZGenjJEVjpbxWynqqsmXL+v25a7Vjq7zeZ4XzFqx3bK2U1xJZs7PhiScAODFoEBmVKnns3M3OhthYcDrh1lvhjjs8exwscXz/Y6WsYL28oJ+53mKlvFbKCidvU/U0nw2CFRISQqtWrVi2bJlL+7Jly2jfvn2+n0lNTSUgwDVyYGAgYPYci4iIiHjUm2/Cb79B+fJkDB/u0U2/+iqsWgWRkTBjhkc3LSIiBfDpKNCjRo3ilVdeYe7cuWzYsIGRI0eybds2Bg0aBJiXL/fu3Tt3/W7duvH+++8zZ84cNm/ezI8//siwYcO47LLLLHHpsoiIiFhIZiY8+qi5HBuL4cHes/37weEwl6dMgfPO89imRUSkED69B/jOO+/k4MGDTJkyhd27d9O8eXOWLl1KvXr1ANi9e7fLnMB9+/bl2LFjzJo1i9GjR1OhQgWuvvpq4uLifPUliIiISEk1dy788w9UqwbDh5sFsYeMHQuHD0PLlvDggx7brIiInIHPB8EaMmQIQ4YMyfe9+fPn52l78MEHeVC/KURERMSbTpyAxx83l8ePNyfm9dDURytWwGuvgc0GL74IQT7/35iISOnh00ugRURERPzSokWwbRvUqAEDBnhssydOwODB5vKAAWC3e2zTIiJSBCqARURERE6VlZU78jNjxkBYmMc2/cwzsGEDVK16chciIlJ8VACLiIiInOqdd2DTJqhcGQYO9Nhmt2yBxx4zl6dPh4oVPbZpEREpIt11IiIiIiVWYmIiSUlJREVFYS/K9cbZ2TBtmrk8YoQ5R5EHGAYMHQppadCpE9xzj0c2KyIiblIPsIiIiJRIDoeDtm3b0rt3b9q2bYsjZ96hwnz0EfzxB5QrZ1asHvLBB7B0KQQHw+zZ5gBYIiJS/FQAi4iISImTmJhIfHy8S1t8fDyJiYkFf8gwTvb+PvggeGje32PHzFmUwJz7t2lTj2xWRETOggpgERERKXGSkpLcagfgiy/gf/+DiAjz8mcPmTQJduyA88+Hhx/22GZFROQsqAAWERGREicqKsqtdgwDpk41lwcNgipVPJLjjz9g5kxzOSEBwsM9slkRETlLKoBFRESkxLHb7cTGxrq0ORyOggfC+u47+PFHCA2F0aM9ksEwYORIcDqhe3e4/nqPbFZERM6BRoEWERGREikuLo7o6OiijQKd0/vbvz/UquWR/X/yCSxbBiEh5vy/IiLieyqARUREpMSy2+1nnv7op5/gq68gKAhO6zU+WxkZMGqUuTxqlHn/r4iI+J4ugRYREZHSLWfk5169oH59j2zyuedg0yaoUUMDX4mI+BMVwCIiIlJ6/fKLea1yQACMG+eRTe7dC489Zi4/+SSULeuRzYqIiAeoABYREZHS6/HHzec77oCCRoh20/jx5ty/bdqYncoiIuI/VACLiIhI6bRhA7z7rrnsoeuU166FuXPN5ZkzzY5lERHxH/qxLCIiIqXTk0+acxXdcgtcdNE5b84wYPhw8/mee6BdOw9kFBERj1IBLCIiIqXP5s2weLG5PH68Rzb59tvwww8QEWHW1iIi4n9UAIuIiEjp88wz4HTCddeZN+ueo9RUGDvWXB43Ds4775w3KSIiXqACWEREREqXgwdh3jxz2eHwyCafegq2b4e6dWHMGI9sUkREvCDI1wFEREREPC0xMZGkpCSioqKw2+2ub77wAqSlwcUXQ6dO57yv7dshLs5cfuopCA8/502KiIiXqAdYREREShSHw0Hbtm3p3bs3bdu2xXFqL29GBsyaZS6PHg02mwf2Z9bTV1wBt99+zpsTEREvUg/wKdLT00lJSfF1jDNKTU31dQS3WCmvlbICpKWl5T4HBfn3t7PVjq3yeo+Vzluw1rEFa+X1RtbVq1cTHx/v0hYfH8/1119PmzZtCFq4kLA9e8iuVYvUrl3Bjd/7+Z27q1YF8MYbEdhsBk88kcbx49me+2LOUWk/F7zJSnn1M9e7rJTXSlnBrM28wf+/CzwsISGBhIQElzan0+mjNCIiIuJJmzZtKrC9TevWBP/X+5s5aBAEB5/TvrKzYdy4UAD69MmiZUv/KX5FRCR/pa4AjomJISYmxqUtOTmZ8uXLExYWRmRkpI+Suc9KWcFaea2SNSsrC4Dw8HDLZLZKzhzK63lWPG/BGsf2VFbK68msLVq0KLA9cuVK+PNPiIwk9MEHCXVzv6efu2++CWvXQmQkPPlkMJGR51ZQe0tpPReKgxXy6mdu8bBSXqtkDQsL88p2dQ+wiIiIlBh2u53Y2FiXNofDYQ6ENX262XDffVChwjntJyMDHn44Z/tQvfo5bU5ERIpJqesBFhERkZItLi6O6Oho11Ggf/sNvvwSAgJg+PBz3scLL8CWLVCzJowc6YHQIiJSLFQAi4iISIljt9tdpz/K6f299VZo0OCctn30KDz2mLk8eTKUKXNOmxMRkWKkS6BFRESkZNu9GxYvNpdHjTrnzc2cGcbBg9C0KfTrd86bExGRYqQCWEREREq2WbMgMxPat4e2bc9pUwcOhDFnjjnyc1wcWGBWGREROYUKYBERESm5jh+HOXPM5dGjz3lzb7zRlPR0G5dfDt26nfPmRESkmKkAFhERkZJr/nw4fBgaNoRbbjmnTf35ZwDLl9cF4KmnwGbzQD4RESlWKoBFRESkZHI64dlnzeURIyAw8Jw2N3lyONnZNm6++cS5XkktIiI+ogJYRERESqaPP4Z//oGKFc95tKpvv4UvvwwmMDCbCRPSPZNPRESKnQpgERERKZmeecZ8HjTonOYqys6GsWPN5euu+5dGjbI9EE5ERHxBBbCIiIiUPD//DD/8AMHBMHToOW3qnXdgzRqIjDS4886/PRRQRER8QYP3i4iISImSmJhI0rBhRAH2u++GWrXOelsnTsDDD5vLDz6YToUKGZ4JKSIiPqEeYBERESkxHA4Hbdu2pffPP9MWcASc2391XngBNm+GGjVgyBAVvyIiVqcCWEREREqExMRE4uPjXdri580jMTHxrLZ39Cg89pi5PGkSREaeY0AREfE5FcAiIiJSIiQlJbnVfiZPPQUHDkCTJnDffeeSTERE/IUKYBERESkRoqKi3GovzL59MGOGufzEExCkUVNEREoEFcAiIiJSItgvu4zYatVc2hwOB3a73e1tPfkkHD8ObdpA9+4eCigiIj6nv2eKiIhIyfDTT8Tt20d0SAhJM2YQdemlZ1X87tgBs2eby1Ongs3m4ZwiIuIzKoBFRESkZJg1CwD7PfdgHzz4rDczdSpkZMCVV0Lnzp4KJyIi/kCXQIuIiIj17dkD77xjLg8detab2bwZXn3VXFbvr4hIyaMCWERERKzv5ZchMxPatYNLLz3rzUyeDFlZ0KULXHGFB/OJiIhfUAEsIiIi1paZCS+8YC6fQ+/vhg2waJG5PHWqB3KJiIjfUQEsIiIi1vbhh7BrF1SvDrfddtabefRRyM42R31u3dpj6URExI+oABYRERFr+2/wKwYMgJCQs9rEunXw7rvmPb+PPebBbCIi4ldUAIuIiIh1/forfPcdBAbCwIFnvZkJE8znnj2heXMPZRMREb+jAlhERESsKyHBfI6Ohtq1z2oTq1bBp5+aNfSkSZ6LJiIi/kfzAJ8iPT2dlJQUX8c4o9TUVF9HcIuV8lopK0BaWlruc1CQf387W+3YKq/3WOm8BWsdW7BW3nPOevgwZRYtwgak9u9P9ln+Dn/ooTAgiHvuyaRmzQwK2ozOXe+xUlawVl6dt95lpbxWygpmbeYN/v9d4GEJCQkk5Py1+D9Op9NHaURERORsBS9ejC01FWezZmR36MDq1avZtGkTjRo1ok2bNkXaxooVgaxYEURIiMG4cSe8nFhERHyt1BXAMTExxMTEuLQlJydTvnx5wsLCiIyM9FEy91kpK1grr1WyZmVlARAeHm6ZzFbJmUN5Pc+K5y1Y49ieykp5zyprdja88goAgcOG8djUqcTHx+e+HRsbS1xcXKGbMIyT0x0NGGDjggvKFLq+zl3vs1JWsEZenbfFw0p5rZI1LCzMK9vVPcAiIiJiPV98Af/8A+XLkxgV5VL8AsTHx5OYmFjoJj79FH76CcLDYfx4b4YVERF/oQJYRERErCdn6qP+/Unavj3fVZKSkgr8eHb2yZGfH3wQatTwdEAREfFHpe4SaBEREbG4TZvgs8/M5SFDiDp4MN/VoqKiCtzE++/DL79A2bIQG+uFjCIi4pfUAywiIiLWMmeOeQPvDTdAo0bY7XZiT6tiHQ4Hdrs9349nZ5+c7mjkSKhc2ct5RUTEb6gHWERERKwjNRXmzjWXhw7NbY6LiyM6OpqkpCSioqIKLH7B7P394w8oVw5GjPByXhER8SsqgEVERMQ63n4bjhyBBg3g+utd3rLb7YUWvmD2/k6ZYi4PHw4VK3opp4iI+CVdAi0iIiLW8eKL5vOAARDg/n9jPvwQfvtNvb8iIqWVCmARERGxhl9/NectCgqCfv3c/vipvb/DhkGlSh7OJyIifk8FsIiIiFjDSy+Zz927Q/Xqbn98yRJYv94c+XnkSM9GExERa1ABLCIiIv4vNRUWLjSXBw50++OGAZMnm8sPPqjeXxGR0koFsIiIiPi/t96C5GQ4/3y4+mq3P75kiTnvb2QkjBrl+XgiImINKoBFRETE/+Vc/nwWg1+d3vureX9FREovFcAiIiLi304d/KpvX7c//sknsG4dlCmj3l8RkdJOBbCIiIj4t5ze3x493B786tTe36FDoUoVD2cTERFLCfJ1ABEREZECHT9+cvCrAQPyvJ2YmEhSUhJRUVHY7fY87y9dCv/7H0REwOjR3g4rIiL+Tj3AIiIi4r9yBr9q2DDP4FcOh4O2bdvSu3dv2rZti8PhcHnfMGDSJHM5JgaqVi2mzCIi4rdUAIuIiIj/yrn8+YEHXAa/SkxMJD4+3mXV+Ph4EhMTc19/9hmsWWP2/o4ZUyxpRUTEz6kAFhEREf+0fj0kJkJwMPTr5/JWUlJSvh/JaT/13t8hQ6BaNa8mFRERi1ABLCIiIv4pp/e3e/c8FWxUVFS+H8lp/+IL+PlnCA9X76+IiJykAlhERET8z/HjsGiRuTxwYJ637XY7sbGxLm0OhwO73e7S+zt4sNsDR4uISAmmUaBFRETE/5w6+FWnTvmuEhcXR3R0dJ5RoL/6ypw2OCwMxo4tztAiIuLvVACLiIiI/3nxRfN5wACXwa9OZ7fb80x/NG2a+TxwINSo4a2AIiJiRboEWkRERPzLL7+YN/AGB0Pfvm599McfYcUK86O691dERE6nAlhERET8S87gVz16uD18c07vb9++cN55no0lIiLWpwJYRERE/McZBr8qzNq15ty/AQHgcHghm4iIWJ7uAT5Feno6KSkpvo5xRqmpqb6O4BYr5bVSVoC0tLTc56Ag//52ttqxVV7vsdJ5C9Y6tmCtvPllDXrtNcKOHSO7YUNSW7cGN34vT5kSBgRx222ZVK+e4c5Hi0TnrvdYKStYK6/OW++yUl4rZQWzNvMG//8u8LCEhAQSEhJc2pxOp4/SiIiIyKmC588HILNv30IHvzrdX3/ZWLIkEIDRozO9kExEREqCUlcAx8TEEBMT49KWnJxM+fLlCQsLIzIy0kfJ3GelrGCtvFbJmpWVBUB4eLhlMlslZw7l9TwrnrdgjWN7Kivlzc3622+wZg0EBxM6YAChbnwNzz8PhgHdu8Nll0V4JafOXe+zUlawRl6dt8XDSnmtkjUsLMwr29U9wCIiIuIf5s41n2++2a3Br7ZsgcWLzeWHH/ZCLhERKTFUAIuIiIjvZWTAwoXmcv/+bn00Ph6cTujcGdq08UI2EREpMUrdJdAiIiLihz7+GA4ehNq1oUuXQldNTEwkKSmJqKgo6tSx53Ycjx9fDDlFRMTSVACLiIiI7736qvncpw8EBha4msPhID4+Pvd1mzaxnDgRR4cOcOWV3g4pIiJWp0ugRURExLe2b4cvvjCX+/UrcLXExESX4hdg9ep4IJHx48Fm82JGEREpEVQAi4iIiG+99po5hHPHjtCoUYGrJSUl5dter14S11/vrXAiIlKSqAAWERER38nOhnnzzOX77it01aioqHzbBw6MUu+viIgUidsF8JYtW7yRQ0REREqhwB9+gM2boVw5uPXWQte12+3Exsa6tFWq5MDhsHszooiIlCBuF8CNGjWiU6dOLFq0iPT0dG9kEhERkVIiKGfqo549ISLijOvHxcXx7bc/UbbsAuAnnn32SQJ0PZuIiBSR278y1q9fzyWXXMLo0aOpUaMGAwcO5Oeff/ZGNhERESnJjhwh6MMPzWU35v799Vc7x471on59Oz17eieaiIiUTG4XwM2bN2f69Ons3LmTefPmsWfPHi6//HKaNWvG9OnT2b9/vzdyioiISAkT9N572NLToXlzaNOmSJ85cQKeespcjo2F4GAvBhQRkRLnrC8aCgoKokePHrz99tvExcXxzz//MGbMGM477zx69+7N7t27PZlTRERESpjgBQvMhf79izyH0euvm7Mm1ahR6IxJIiIi+TrrAnjNmjUMGTKEmjVrMn36dMaMGcM///zDN998w86dO7nllls8mVNERERKkl9/JXDtWozgYLj33iJ9JDsb4uLM5ZEjISzMi/lERKRECnL3A9OnT2fevHn8/fff3HjjjSxYsIAbb7yRgP9GoGjQoAEvvvgiTZs29XhYERERKSHmzgXAeeONBFWtWqSPfPwx/PWXOWD0wIHeDCciIiWV2wXwnDlz6N+/P/369aNGjRr5rlO3bl1effXVcw4nIiIiJVBGBixaBEBm795F+s+IYcCTT5rLgwdD+fLeiyciIiWX2wXwsmXLqFu3bm6Pbw7DMNi+fTt169YlJCSEPn36eCykiIiIlCBLlsDBg2TXqoXzmmuK9JHvv4effoLQUBg+3Mv5RESkxHL7HuCGDRty4MCBPO2HDh2iQYMGHgklIiIiJdh/V4ll3XMPBAYW6SM59/726QM1a3ormIiIlHRuF8CGYeTbnpKSQphGoxAREZHCbN8OX34JQGYRB7/69VdYuhQCAmDsWG+GExGRkq7Il0CPGjUKAJvNxqOPPkpERETue06nk8TERC6++GKPBxQREZESZP5884beq67COP/83ObExESSkpKIiorCbre7fCQ+3ny+9VZo1KgYs4qISIlT5AJ43bp1gNkD/NtvvxESEpL7XkhI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69evdyl+wRwZetq0abRp08aj4URERMS/JSYmuhS/APFPPUU0YC9XDrp3L/Tzx4/D7Nnm8pgxZ7xVWERE5JwUaRqkUzVp0oS9e/fmad+3bx+NGjXySCgRERGxhqSkpPzbAe68E84wS8PChcEcOgQNG0KPHp7PJyIicqoiFcDJycm5j8cff5xhw4bx7rvvsmPHDnbs2MG7777LiBEjiIuL83ZeERER8SNRUVH5t8MZL3/OyoJZs4IBGDUKAgM9m01EROR0RboEukKFCthOuSbJMAzuuOOO3DbDMADo1q0bTqfTCzFFRETEH9ntdmJjY10ug3YA9saNoV27Qj/70UdB/PtvAFWqFOlWYRERkXNWpAJ4+fLl3s4hIiIiFhUXF0d0dLQ5CvSMGdjXrj3j3L+GATNnmr2/MTEQEVFcaUVEpDQrUgHcsWNHb+cQERERC7Pb7dirV4fevYs09++338K6dYGEhRnExGjkKxERKR5ujwKdIzU1lW3btnHixAmX9hYtWpxzKBEREbGgnLl/r74a6tYtdNWnnjKf7703i6pVg70cTERExOR2Abx//3769evHZ599lu/7ugdYRESkFDIMeO01c/kMN/T+/jt89hnYbAZDh54AVACLiEjxcHsapBEjRnD48GF++uknwsPD+fzzz3nttddo3LgxS5Ys8UZGERER8Xc//ACbN0PZsmecz+iZZ8znm2920rChUQzhRERETG73AH/zzTd89NFHtGnThoCAAOrVq0fnzp0pV64cTzzxBF27dvVGThEREfFnOb2/t98OZcoUuNrOnbB4sbk8fPiJAtcTERHxBrd7gI8fP061atUAqFSpEvv37wfgoosuYu3atZ5NJyIiIv4vLQ3efttc7tOn0FWfew4yM+GKK6BNm+xiCCciInKS2wVwkyZN+PvvvwG4+OKLefHFF9m5cycvvPACNWvW9HhAERER8XMffQTHjkH9+nD55QWulpwML7xgLo8dWzzRRERETuX2JdAjRoxg9+7dAEycOJEuXbqwePFiQkJCmD9/vqfziYiIiL/LGf25Vy8IKPhv6y+/bBbBTZtC166QmlpM+URERP7jdgF8zz335C5fcsklbN26lb/++ou6detSpUoVj4YTERERP7dnD3zxhblcyNy/mZkwY4a5PGZMoXWyiIiI15z1PMAAhmEQHh7OpZde6qk8IiIiYgGJ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Dhw4QJ8+fejVqxebN29m8ODBjB492uG4W7dupWfPnvTp04effvqJhIQENmzYwLBhw4rMvmHDBoKCgmjatGlem91u5+677yYoKIjExETeeOMNxo0bV2Bfu93OZ599xl133UXfvn155plnaN68OUeOHOHIkSP07ds3r2/79u1Zv3590V+iiIjIZfDzdAAREZHyYPfu3RiGUewpupcrOTmZxo0bO7SNGDGCBQsWAGaRffDgwbz3goODWbBgARUrVsxrGzhwYN52w4YNmT17Nu3btyc1NZWQkBDmzp1Lw4YNefXVV7HZbDRu3JitW7cybdq0vP1efvll+vXrx4gRIwBo1KgRs2fPpkuXLsydO5eAgIAC2fft20dYWJjD6c8rV65kz549rFmzhpo1awLw4osv0r17d4d9v/vuO+x2Ox07dsTHx4eQkBD8/Pzy9rlQ7dq1C52xFhERcQXNAIuIiGBenwsFZ2Fd7eLjjxs3js2bNzN+/HhSU1Md3rvhhhscil+ApKQk7rrrLurXr0+lSpXyFt3av38/ANu3bycyMtLhczp06OBwjE2bNrFo0SJCQkLyHj179sRut7N3795Cc6enpxcojHfu3EndunUdCtn27dsX2Hf58uXccccdJbp2ODAwkLS0tEv2ExERKQ0VwCIiIpizoDabrUQLMFWqVImUlJQC7adOnSI0NLTYz9ixY4dDW40aNbj++uu5+uqrC/S/+FTss2fP0qNHD0JCQnjvvff4/vvvWbp0KZC/SFZuIV8cu93Ok08+yebNm/MeW7ZsYdeuXVx33XWF7lO9enX+/PNPhzbDMEr0HwaffPIJd9111yX7gXkqeo0aNUrUV0RExFkqgEVERICqVavSs2dP4uPjC10M6sJ76DZp0oTvv//e4X3DMNi0aVOBU5wv9OCDD7Jz506WL19eqow7duzg+PHjTJ06lc6dO9OkSZMCC2A1a9aswIJdF7++6aab2LZtG9dff32Bx8Uzzrlat27N0aNHHYrgJk2asH//fo4dO5bXdvH3smvXLvbt20ePHj3y2ipWrEhOTk6hn/Pzzz/TunXrYr4FERGR0lMBLCIict6cOXPIycmhffv2fPzxx+zatYvt27cze/Zsh9OIR40axcKFC3n99ddJTk5my5YtDBs2jD179hR7u6QHHniAe++9lwceeIBJkyaRmJjIvn37WLt2LQkJCfj6+habr169elSsWJHXXnuNX3/9lU8++YTJkyc79BkyZAh79uwhOjqanTt3snjx4rxVlnPFxsby7bffEhUVxebNm9m1axeffPIJTz31VJGf3bp1a2rUqMHGjRvz2rp37851113Ho48+yk8//cTGjRvzFsHKnRlevnw5t9xyC0FBQXn7XXvttezdu5fNmzdz/PhxMjMz895bv369Q7EsIiLiSiqARUREzmvQoAE//vgjXbt25ZlnnqFFixZ0796d1atXM3fu3Lx+999/P4sWLeKdd96hXbt29OjRgz179rB+/Xrq169f5PFtNhsJCQnMnDmTFStW0K1bNxo3bszAgQOpW7cuGzZsKDZfjRo1WLRoER9++CHNmjVj6tSpTJ8+3aFPvXr1+Pjjj/n0009p1aoV8+bN46WXXnLo07JlS9auXcuuXbvo3LkzrVu35rnnnqNWrVpFfravry8DBw7k/fffd2hbtmwZqamptGvXjsGDB/Pss88C5F0vvHz58gKnP99zzz3ceuutdO3alRo1auTd9ujbb78lJSWFe++9t9jvQUREpLRsRkkuFhIRERGvd+zYMZo3b86mTZuKLPQ3btzIX/7yF3bv3k1oaCi1atXiwIEDha74fLH77ruP1q1bM3bsWFdHFxERAXQbJBERESmhsLAwFi5cyP79+/MK4KVLlxISEkKjRo3YvXs3Tz/9NJ06deK6664jOTmZGTNmlKj4zczMpFWrVowcOdLdP4aIiHgxzQCLiIhIqb377rtMnjyZAwcOUL16dW655RZeeeUVqlWr5uloIiIiBagAFhEREREREa+gRbBERERERETEK6gAFhEREREREa+gAlhERERERES8ggpgERERERER8QoqgEVERERERMQrqAAWERERERERr6ACWERERERERLyCCmARERERERHxCiqARURERERExCv8P8VDuGY0gGUHAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 35; tmean = 0.5; tstdev = 0.1; xmin=0.0; xmax=1.0\n",
    "np.random.seed(seed=seed)                               # set random number seed\n",
    "Xval = np.linspace(xmin,xmax,100)\n",
    "X = np.random.normal(loc=tmean,scale=tstdev,size=n-2); X = np.append(X,[0.8,0.9])\n",
    "X = np.sort(X); CDF = np.arange(1,n+1,1)/(n+1)\n",
    "\n",
    "mean = np.average(X); stdev = np.std(X)\n",
    "\n",
    "mean_ls,stdev_ls = curve_fit(norm.cdf,X,CDF,p0=[0,1],method='lm')[0] \n",
    "\n",
    "mean_ml,stdev_ml = minimize(gaussian_negloglike,x0=[0,1],method='Nelder-Mead').x\n",
    "\n",
    "plt.subplot(121)\n",
    "plt.scatter(np.sort(X),np.arange(1,n+1,1)/(n+1),c='black',s=10,edgecolor='black',zorder=10)\n",
    "plt.title('Copper Distribution via Parameter Estimation')\n",
    "# plt.plot(Xval,stats.norm.cdf(Xval,loc=mean,scale=stdev),c='black',zorder=1,label='Parameter Inference')\n",
    "plt.plot(Xval,stats.norm.cdf(Xval,loc=mean_ls,scale=stdev_ls),c='red',zorder=1,label='OLS')\n",
    "plt.plot(Xval,stats.norm.cdf(Xval,loc=mean_ml,scale=stdev_ml),c='blue',zorder=1,label='MLE')\n",
    "\n",
    "plt.legend(loc='upper left')\n",
    "plt.ylim([0,1]); plt.xlim([0,1.0]); add_grid(); plt.xlabel('CU Grade (g/t)'); plt.ylabel('Cumulative Probability')\n",
    "\n",
    "plt.subplots_adjust(left=0.0,bottom=0.0,right=3.0,top=1.2); plt.show() # set plot size "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d191a1a",
   "metadata": {},
   "source": [
    "#### Make the Interactive Dashboard\n",
    "\n",
    "Change the mean and standard deviation of a Gaussian model and observe the ordinary least squares and maximum likelihood assessment of fit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f7b6a918",
   "metadata": {},
   "outputs": [],
   "source": [
    "l = widgets.Text(value='                                  Interactive Statistical Model Fitting Demo, Prof. Michael Pyrcz, The University of Texas at Austin',\n",
    "                 layout=Layout(width='750px', height='30px'))\n",
    "\n",
    "mean = widgets.FloatSlider(min=0.0, max = 1.0, value=0.5, step = 0.02, description = '$\\mu$',orientation='horizontal', \n",
    "           style = {'description_width': 'initial'},layout=Layout(width='370px', height='30px'),continuous_update=False)\n",
    "stdev = widgets.FloatSlider(min=0.01, max = 1.0, value=0.1, step = 0.02, description = r'$\\sigma$',orientation='horizontal',\n",
    "           style = {'description_width': 'initial'},layout=Layout(width='370px', height='30px'),continuous_update=False)\n",
    "\n",
    "ui = widgets.HBox([mean,stdev],)\n",
    "ui2 = widgets.VBox([l,ui],)\n",
    "\n",
    "def run_plot(mean,stdev):\n",
    "    np.random.seed(seed=seed)                               # set random number seed\n",
    "    Xval = np.linspace(xmin,xmax,100)\n",
    "    \n",
    "    CDF_hat = norm.cdf(X,loc = mean,scale=stdev)            # for specified mean and stdev calculate the PDF and CDF\n",
    "    pdf_hat = stats.norm.pdf(X,loc=mean,scale=stdev)\n",
    "    sq_err = (CDF-CDF_hat)**2                               # calculate the square error of the CDF\n",
    "    sse = np.sum(sq_err)\n",
    "    prod_like = np.product(pdf_hat)                         # calculate the likelihoof from the PDF\n",
    "    neg_log_like = -np.sum(np.log(pdf_hat))\n",
    "    \n",
    "    mean_OLS,stdev_OLS = curve_fit(norm.cdf,np.sort(X),np.arange(1,n+1,1)/(n+1), p0=[0,1],method='lm')[0] # calculate OLS and error\n",
    "    sq_err_OLS = (CDF-norm.cdf(X,loc = mean_OLS,scale=stdev_OLS))**2\n",
    "    sse_OLS = np.sum(sq_err_OLS)\n",
    "    \n",
    "    mean_MLE,stdev_MLE = minimize(gaussian_negloglike,x0=[0,1],method='Nelder-Mead').x # calculate MLE and likelihood\n",
    "    pdf_hat_MLE = stats.norm.pdf(X,loc=mean_MLE,scale=stdev_MLE)\n",
    "    prod_like_MLE = np.product(pdf_hat_MLE) \n",
    "    neg_log_like_MLE = -np.sum(np.log(pdf_hat_MLE))\n",
    "    \n",
    "    plt.subplot(221)                                         # plot CDF and errors and OLS solution\n",
    "    plt.scatter(np.sort(X),np.arange(1,n+1,1)/(n+1),c='black',s=10,edgecolor='black',zorder=10)\n",
    "    plt.title('Ordinary Least Squares - Model and Data Error')\n",
    "    plt.plot(Xval,stats.norm.cdf(Xval,loc=mean,scale=stdev),c='red',lw=3,label=r'$\\hat{F}_{Cu}(\\alpha)$',zorder=100)\n",
    "    plt.plot(Xval,stats.norm.cdf(Xval,loc=mean_OLS,scale=stdev_OLS),c='grey',alpha=0.3,lw=3,label=r'$\\hat{F}_{Cu}^{OLS}(\\alpha)$',zorder=10)\n",
    "    for i in range(0,len(X)):\n",
    "        plt.plot([X[i],X[i]],[CDF[i],CDF_hat[i]],color='black',alpha=0.3,zorder=1)\n",
    "    plt.legend(loc='upper left')\n",
    "    plt.ylim([0,1]); plt.xlim([0,1.0]); add_grid(); plt.xlabel('Copper Grade (g/t)'); plt.ylabel(r'Cumulative Probability, $F_{Cu}$')\n",
    "    plt.annotate(r'Current Model: $\\mu = $' + str(np.round(mean,2)),xy=[0.68,0.4],c='red')\n",
    "    plt.annotate(r'$\\sigma = $' + str(np.round(stdev,2)),xy=[0.80,0.35],c='red')\n",
    "    plt.annotate(r'OLS Solution: $\\mu = $' + str(np.round(mean_OLS,2)),xy=[0.69,0.3],c='black')\n",
    "    plt.annotate(r'$\\sigma = $' + str(np.round(stdev_OLS,2)),xy=[0.80,0.25],c='black')\n",
    "    \n",
    "    plt.subplot(222)                                         # plot error distribution and OLS solution\n",
    "    plt.hist(sq_err,color='red',alpha=0.6,edgecolor='darkred',lw=2,bins=np.linspace(0.0,0.1,41),zorder=10)\n",
    "    plt.hist(sq_err_OLS,color='grey',alpha=1.0,edgecolor='black',lw=2,bins=np.linspace(0.0,0.1,41),zorder=1)\n",
    "    plt.xlabel(r'Squared Error, $\\left( \\hat{F}_{Cu}(\\alpha) - F_{Cu}(\\alpha) \\right)^2$'); plt.ylabel('Frequency'); plt.title('Ordinary Least Squares - Data Error Distribution')\n",
    "    add_grid(); plt.xlim([0.0,0.1]); plt.ylim([0,30])\n",
    "    plt.annotate(r'Minimize: $\\sum_{\\alpha=1}^n \\left( \\hat{F}_{Cu}(\\alpha) - F_{Cu}(\\alpha) \\right)^2 = $' + str(np.round(sse,2)),xy=[0.065,25.0],c='red')\n",
    "    plt.annotate(r'OLS: $\\sum_{\\alpha=1}^n \\left( \\hat{F}_{Cu}^{OLS}(\\alpha) - F_{Cu}(\\alpha) \\right)^2 = $' + str(np.round(sse_OLS,2)),xy=[0.069,22.0],c='black')\n",
    "    \n",
    "    plt.subplot(223)                                         # plot data likelihood, PDF and MLE solution\n",
    "    plt.scatter(np.sort(X),np.full(len(X),0.03),c='black',s=10,edgecolor='black',zorder=10)\n",
    "    plt.title('Copper Distribution via Parameter Estimation')\n",
    "    plt.plot(Xval,stats.norm.pdf(Xval,loc=mean,scale=stdev),c='blue',lw=3,label=r'$\\hat{f}_{Cu}(\\alpha)$',zorder=100)\n",
    "    plt.plot(Xval,stats.norm.pdf(Xval,loc=mean_MLE,scale=stdev_MLE),c='grey',alpha=0.3,lw=3,label=r'$\\hat{f}_{Cu}^{MLE}(\\alpha)$',zorder=10)\n",
    "    for i in range(0,len(X)):\n",
    "        plt.plot([X[i],X[i]],[0.0,pdf_hat[i]],color='black',alpha=0.3,zorder=1)\n",
    "    plt.annotate(r'Current Model: $\\mu = $' + str(np.round(mean,2)),xy=[0.68,3.5],c='blue')\n",
    "    plt.annotate(r'$\\sigma = $' + str(np.round(stdev,2)),xy=[0.80,3.3],c='blue')\n",
    "    plt.annotate(r'MLE Solution: $\\mu = $' + str(np.round(mean_MLE,2)),xy=[0.69,3.1],c='black')\n",
    "    plt.annotate(r'$\\sigma = $' + str(np.round(stdev_MLE,2)),xy=[0.80,2.9],c='black')\n",
    "    plt.xlabel('Copper Grade (g/t)'); plt.ylabel(r'Likelihood, Density, $f_{Cu}$'); plt.title('Maximum Likelihood - Model and Data Likelihood')\n",
    "    add_grid(); plt.xlim([0.0,1.0]); plt.ylim([0.0,4.0]); plt.legend(loc='upper left')\n",
    "    \n",
    "    plt.subplot(224)                                          # plot data likelihood distribution and MLS solution\n",
    "    plt.hist(pdf_hat,color='blue',alpha=0.5,edgecolor='darkblue',lw=2,bins=np.linspace(0.0,4.0,41),orientation='horizontal',zorder=100)\n",
    "    plt.hist(pdf_hat_MLE,color='grey',alpha=1.0,edgecolor='black',lw=2,bins=np.linspace(0.0,4.0,41),orientation='horizontal',zorder=10)\n",
    "    plt.xlabel('Frequency'); plt.ylabel(r'Likelihood, Density, $f_{Cu}$'); plt.title('Maximum Likelihood - Data Likelihood Distribution')\n",
    "    add_grid(); plt.xlim([0.0,10.0]); plt.ylim([0.0,4.0])\n",
    "    plt.annotate(r'Maximize: $\\prod_{\\alpha=1}^n \\hat{f}_\\alpha = $' + str(np.round(prod_like,2)),xy=[6.5,3.5],c='blue')\n",
    "    plt.annotate(r'MLE: $\\prod_{\\alpha=1}^n \\hat{f}_{Cu}^{MLE}(\\alpha) = $' + str(np.round(prod_like_MLE,2)),xy=[6.9,3.1],c='black')\n",
    "    plt.annotate(r'Minimize: $-\\sum_{\\alpha=1}^n log\\left[ \\hat{f}_{Cu}(\\alpha) \\right]  = $' + str(np.round(neg_log_like,2)),xy=[6.5,2.7],c='blue')\n",
    "    plt.annotate(r'MLE: $-\\sum_{\\alpha=1}^n \\left( log(\\hat{f}_{Cu}^{MLE}(\\alpha) )   \\right)  = $' + str(np.round(neg_log_like_MLE,2)),xy=[6.9,2.3],c='black')\n",
    "     \n",
    "    plt.subplots_adjust(left=0.0,bottom=0.0,right=3.0,top=2.2); plt.show() # set plot size \n",
    "    \n",
    "# connect the function to make the samples and plot to the widgets    \n",
    "interactive_plot = widgets.interactive_output(run_plot, {'mean':mean,'stdev':stdev})\n",
    "interactive_plot.clear_output(wait = True)               # reduce flickering by delaying plot updating  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "358a032f",
   "metadata": {},
   "source": [
    "### Interactive Statistical Model Fitting Demonstation \n",
    "\n",
    "#### Michael Pyrcz, Professor, The University of Texas at Austin \n",
    "\n",
    "Change the mean and standard deviation of a Gaussian model and observe the ordinary least squares and maximum likelihood assessment of fit.\n",
    "\n",
    "### The Inputs\n",
    "\n",
    "* Gaussian Parametric Model: **$\\mu$** - mean, **$\\sigma$** - standard deviation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "483fc030",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ff55d389cee24d1a991ed8b4ccefe3f3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(Text(value='                                  Interactive Statistical Model Fitting Demo, Prof.…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bc861e8c8a5e49c991b93a6f1b075434",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(ui2, interactive_plot)                           # display the interactive plot"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07eb83a5",
   "metadata": {},
   "source": [
    "#### Comments\n",
    "\n",
    "This was a basic demonstration of squared error and data likelihood for OLS and MLE model fitting respectively. I have many other demonstrations and even basics of working with DataFrames, ndarrays, univariate statistics, plotting data, declustering, data transformations and many other workflows available at https://github.com/GeostatsGuy/PythonNumericalDemos and https://github.com/GeostatsGuy/GeostatsPy. \n",
    "  \n",
    "#### The Author:\n",
    "\n",
    "### Michael J. Pyrcz, Professor, The University of Texas at Austin \n",
    "*Novel Data Analytics, Geostatistics and Machine Learning Subsurface Solutions*\n",
    "\n",
    "With over 17 years of experience in subsurface consulting, research and development, Michael has returned to academia driven by his passion for teaching and enthusiasm for enhancing engineers' and geoscientists' impact in subsurface resource development. \n",
    "\n",
    "For more about Michael check out these links:\n",
    "\n",
    "#### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n",
    "\n",
    "#### Want to Work Together?\n",
    "\n",
    "I hope this content is helpful to those that want to learn more about subsurface modeling, data analytics and machine learning. Students and working professionals are welcome to participate.\n",
    "\n",
    "* Want to invite me to visit your company for training, mentoring, project review, workflow design and / or consulting? I'd be happy to drop by and work with you! \n",
    "\n",
    "* Interested in partnering, supporting my graduate student research or my Subsurface Data Analytics and Machine Learning consortium (co-PIs including Profs. Foster, Torres-Verdin and van Oort)? My research combines data analytics, stochastic modeling and machine learning theory with practice to develop novel methods and workflows to add value. We are solving challenging subsurface problems!\n",
    "\n",
    "* I can be reached at mpyrcz@austin.utexas.edu.\n",
    "\n",
    "I'm always happy to discuss,\n",
    "\n",
    "*Michael*\n",
    "\n",
    "Michael Pyrcz, Ph.D., P.Eng. Professor, The Hildebrand Department of Petroleum and Geosystems Engineering, Bureau of Economic Geology, Jackson School of Geosciences, The University of Texas at Austin\n",
    "\n",
    "#### More Resources Available at: [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)  \n",
    "  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f51344db",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
